/**
 * @module console
 * @description
 * 这个模块包含了与生成和处理控制台命令相关的功能。
 * 主要用于将蓝图数据转换为可以在游戏控制台中执行的命令，
 * 或将数据复制到玩家的剪贴板。
 */

import type TerrainSchematic from "../schematic";
import { getData } from "./io";

/**
 * 调用控制台复制到剪贴板接口
 * @param data 数据
 * @param id 接口id
 * @returns 接口返回的id
 */
async function consoleFetch(
  data: string,
  id: string,
  entity: GamePlayerEntity
): Promise<boolean> {
  const response = await http.fetch("https://api.box3lab.com/dao3lab/console", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      id: id,
      data: data,
    }),
  });
  const result = await response.json();
  if (result.code === 200) {
    entity.player.link(
      "https://api.box3lab.com/dao3lab/console?id=" + result.id,
      {
        isNewTab: true,
      }
    );
    return true;
  }
  return false;
}

/**
 * 生成一个可直接在控制台运行的地形导入命令。
 * 并生成一段自解压、自执行的JS代码，粘贴到控制台即可自动还原并放置地形。
 *
 * @param position 目标放置位置（世界坐标，基点为结构左下角）
 * @param entity 接收命令链接的玩家实体
 * @returns Promise<boolean>
 */
export async function copyConsoleCommand(
  schematic: TerrainSchematic,
  position: GameVector3,
  entity: GamePlayerEntity
): Promise<boolean> {
  const commandData = schematic.getData();
  const jsonString = JSON.stringify(commandData);
  const command = `(()=>{"use strict";(()=>{try{const t=${jsonString},e={x:${position.x},y:${position.y},z:${position.z}};if(!t||!t.palette||!t.layers)return void console.error("导入失败：数据格式无效。");const o=[];for(let e=0;e<t.palette.length;e+=2)o.push({id:t.palette[e],rot:t.palette[e+1]});t.layers.forEach(((t,r)=>{if(!t)return;const s=t.split(";");for(const t of s){const[s,l,c]=t.split(",").map(Number),n=o[c];if(n){const t=e.x+s,o=e.y+r,c=e.z+l;voxels.setVoxel(t,o,c,n.id,n.rot)}}})),console.log(\`结构已成功放置于 \${e.x},\${e.y},\${e.z} 渲染需要一定时间，请稍等...\`)}catch(t){console.error("执行命令时发生错误:",t)}})()})();`;
  const success = await consoleFetch(
    command,
    "terrainSchematic.import.",
    entity
  );
  return success;
}

/**
 * 复制JSON蓝图数据到剪贴板
 * @param entity 接收命令链接的玩家实体
 * @returns Promise<boolean>
 */
export async function copyJSON(
  schematic: TerrainSchematic,
  entity: GamePlayerEntity
): Promise<boolean> {
  const commandData = schematic.getData();
  const jsonString = JSON.stringify(commandData);
  const success = await consoleFetch(
    jsonString,
    "terrainSchematic.copyJSON",
    entity
  );
  return success;
}
